ARD2  RC2
Airbag Reference Demonstrator using MPC5604P
CG147_Diag.c
Go to the documentation of this file.
00001 
00016 #include "derivative.h"
00017 #include "Compile_Options.h"
00018 #include "CG147.h"
00019 #include "CG147_Diag.h"
00020 #include "HAL.h"
00021 #include "MailScheduler.h"
00022 #include "DSPI.h"
00023 #include "SIU.h"
00024 #include "Utils.h"
00025 /*
00026  ******************************************************************************
00027  * constants
00028  ******************************************************************************
00029  */
00030 /***************Constants defined for SBC POM Built-in Tests******************/
00032 static const uint8_t cau8SBCTests[] =
00033 {
00034   CG147_TEST_IS_VER_CAP, CG147_TEST_IS_VER_ESR, CG147_TEST_IS_POL_PROT };
00036 const uint8_t cu8SizeOfSBCTests = N_ELEMENTS(cau8SBCTests);
00038 static const uint8_t cau8SBCTestResults[] =
00039 {
00040   CLEAR, CLEAR, 0x80u };
00042 static const uint8_t cau8SBCInitialTestAoutRoutes[] =
00043 {
00044   SBC_AOUT_ER1_DIV_10, SBC_AOUT_ER2_DIV_10, SBC_AOUT_ER3_DIV_10,
00045   SBC_AOUT_ER4_DIV_10, SBC_AOUT_ER5_DIV_10, SBC_AOUT_ER6_DIV_10 };
00049 static const uint16_t cau16AoutHiLimitsPerTest[] =
00050 {
00051   SBC_TEST_VER_CAP_LIMIT_HI, SBC_TEST_VER_ESR_LIMIT_HI,
00052   SBC_TEST_VER_POL_LIMIT_HI };
00056 static const uint16_t cau16AoutLoLimitsPerTest[] =
00057 {
00058   SBC_TEST_VER_CAP_LIMIT_LO, SBC_TEST_VER_ESR_LIMIT_LO,
00059   SBC_TEST_VER_POL_LIMIT_LO };
00063 static const uint8_t cau8AoutCheckLimit[] = 
00064 {
00065   TRUE, CLEAR, TRUE
00066 };
00067 /********************Constants defined for SBC FLM Tests***********************/
00068 const uint8_t cau8SBCInitialTestAoutRoutesIGH[] =
00069 {
00070   SBC_AOUT_IGH1, SBC_AOUT_IGH2, SBC_AOUT_IGH3, SBC_AOUT_IGH4, SBC_AOUT_IGH5,
00071   SBC_AOUT_IGH6, SBC_AOUT_IGH7, SBC_AOUT_IGH8, SBC_AOUT_IGH9, SBC_AOUT_IGH10,
00072   SBC_AOUT_IGH11, SBC_AOUT_IGH12 };
00073 const uint8_t cau8SBCInitialTestAoutRoutesIGL[] =
00074 {
00075   SBC_AOUT_IGL1, SBC_AOUT_IGL2, SBC_AOUT_IGL3, SBC_AOUT_IGL4, SBC_AOUT_IGL5,
00076   SBC_AOUT_IGL6, SBC_AOUT_IGL7, SBC_AOUT_IGL8, SBC_AOUT_IGL9, SBC_AOUT_IGL10,
00077   SBC_AOUT_IGL11, SBC_AOUT_IGL12 };
00078 /* ******************Constants defined for SBC AIN Tests***********************/
00079 static const uint8_t cau8SBCInitialTestAnaHeadSettings[] =
00080 {
00081   /* First tests correspond to ADC tests */
00082    SBC_AINADC_VAS_SET, SBC_AINADC_REF_BG, SBC_AINADC_REF_BG2,
00083   SBC_AINADC_23REF_BG2, SBC_AINADC_AGND, 
00084   /* Next follows a test for the Mux with a reference voltage */
00085   SBC_AINMUX_NO_SWITCHES,
00086   /* Next we test each Mux channel with all channels connected to GND */
00087   SBC_AINMUX_NO_SWITCHES, SBC_AINMUX_NO_SWITCHES, SBC_AINMUX_NO_SWITCHES, 
00088   SBC_AINMUX_NO_SWITCHES, SBC_AINMUX_NO_SWITCHES, SBC_AINMUX_NO_SWITCHES,
00089   SBC_AINMUX_NO_SWITCHES, SBC_AINMUX_NO_SWITCHES,
00090   /* Now we switch CH1 on and test all channels */
00091   SBC_AINMUX_AIN1, SBC_AINMUX_AIN1, SBC_AINMUX_AIN1, SBC_AINMUX_AIN1, 
00092   SBC_AINMUX_AIN1, SBC_AINMUX_AIN1, SBC_AINMUX_AIN1, SBC_AINMUX_AIN1,
00093   /* Now we switch CH2 on and test all channels */
00094   SBC_AINMUX_AIN2, SBC_AINMUX_AIN2, SBC_AINMUX_AIN2, SBC_AINMUX_AIN2, 
00095   SBC_AINMUX_AIN2, SBC_AINMUX_AIN2, SBC_AINMUX_AIN2, SBC_AINMUX_AIN2,
00096   /* Now we switch CH3 on and test all channels */
00097   SBC_AINMUX_AIN3, SBC_AINMUX_AIN3, SBC_AINMUX_AIN3, SBC_AINMUX_AIN3, 
00098   SBC_AINMUX_AIN3, SBC_AINMUX_AIN3, SBC_AINMUX_AIN3, SBC_AINMUX_AIN3,
00099   /* Now we switch CH4 on and test all channels */
00100   SBC_AINMUX_AIN4, SBC_AINMUX_AIN4, SBC_AINMUX_AIN4, SBC_AINMUX_AIN4, 
00101   SBC_AINMUX_AIN4, SBC_AINMUX_AIN4, SBC_AINMUX_AIN4, SBC_AINMUX_AIN4,
00102   /* Now we switch CH5 on and test all channels */
00103   SBC_AINMUX_AIN5, SBC_AINMUX_AIN5, SBC_AINMUX_AIN5, SBC_AINMUX_AIN5, 
00104   SBC_AINMUX_AIN5, SBC_AINMUX_AIN5, SBC_AINMUX_AIN5, SBC_AINMUX_AIN5,
00105   /* Now we switch CH6 on and test all channels */
00106   SBC_AINMUX_AIN6, SBC_AINMUX_AIN6, SBC_AINMUX_AIN6, SBC_AINMUX_AIN6, 
00107   SBC_AINMUX_AIN6, SBC_AINMUX_AIN6, SBC_AINMUX_AIN6, SBC_AINMUX_AIN6,
00108   /* Now we switch CH7 on and test all channels */
00109   SBC_AINMUX_AIO1, SBC_AINMUX_AIO1, SBC_AINMUX_AIO1, SBC_AINMUX_AIO1, 
00110   SBC_AINMUX_AIO1, SBC_AINMUX_AIO1, SBC_AINMUX_AIO1, SBC_AINMUX_AIO1,
00111   /* Now we switch CH8 on and test all channels */
00112   SBC_AINMUX_AIO2, SBC_AINMUX_AIO2, SBC_AINMUX_AIO2, SBC_AINMUX_AIO2, 
00113   SBC_AINMUX_AIO2, SBC_AINMUX_AIO2, SBC_AINMUX_AIO2, SBC_AINMUX_AIO2,
00114   
00115 };
00116 const uint8_t cu8SizeOfTestAnaHeadSettings 
00117        = N_ELEMENTS(cau8SBCInitialTestAnaHeadSettings);
00118 static const uint8_t cau8SBCInitialTestAnaMUXChannel[] =
00119 {
00120   /* First tests correspond to ADC tests - no mux */
00121   SBC_AINMUX_VOLT, SBC_AINMUX_VOLT, SBC_AINMUX_VOLT, 
00122   SBC_AINMUX_VOLT, SBC_AINMUX_VOLT, 
00123   /* Next follows a test for the Mux with a reference voltage */
00124   SBC_AINMUX_VOLT, 
00125   /* Next we test each Mux channel with all channels connected to GND */
00126   SBC_AINMUX_AIN1, SBC_AINMUX_AIN2, SBC_AINMUX_AIN3, SBC_AINMUX_AIN4,
00127   SBC_AINMUX_AIN5, SBC_AINMUX_AIN6, SBC_AINMUX_AIO1, SBC_AINMUX_AIO2,
00128   /* Now we switch CH1 on and test all channels */
00129   SBC_AINMUX_AIN1, SBC_AINMUX_AIN2, SBC_AINMUX_AIN3, SBC_AINMUX_AIN4,
00130   SBC_AINMUX_AIN5, SBC_AINMUX_AIN6, SBC_AINMUX_AIO1, SBC_AINMUX_AIO2,
00131   /* Now we switch CH2 on and test all channels */
00132   SBC_AINMUX_AIN1, SBC_AINMUX_AIN2, SBC_AINMUX_AIN3, SBC_AINMUX_AIN4,
00133   SBC_AINMUX_AIN5, SBC_AINMUX_AIN6, SBC_AINMUX_AIO1, SBC_AINMUX_AIO2,
00134   /* Now we switch CH3 on and test all channels */
00135   SBC_AINMUX_AIN1, SBC_AINMUX_AIN2, SBC_AINMUX_AIN3, SBC_AINMUX_AIN4,
00136   SBC_AINMUX_AIN5, SBC_AINMUX_AIN6, SBC_AINMUX_AIO1, SBC_AINMUX_AIO2,
00137   /* Now we switch CH4 on and test all channels */
00138   SBC_AINMUX_AIN1, SBC_AINMUX_AIN2, SBC_AINMUX_AIN3, SBC_AINMUX_AIN4,
00139   SBC_AINMUX_AIN5, SBC_AINMUX_AIN6, SBC_AINMUX_AIO1, SBC_AINMUX_AIO2,
00140   /* Now we switch CH5 on and test all channels */
00141   SBC_AINMUX_AIN1, SBC_AINMUX_AIN2, SBC_AINMUX_AIN3, SBC_AINMUX_AIN4,
00142   SBC_AINMUX_AIN5, SBC_AINMUX_AIN6, SBC_AINMUX_AIO1, SBC_AINMUX_AIO2,
00143   /* Now we switch CH6 on and test all channels */
00144   SBC_AINMUX_AIN1, SBC_AINMUX_AIN2, SBC_AINMUX_AIN3, SBC_AINMUX_AIN4,
00145   SBC_AINMUX_AIN5, SBC_AINMUX_AIN6, SBC_AINMUX_AIO1, SBC_AINMUX_AIO2,
00146   /* Now we switch CH7 on and test all channels */
00147   SBC_AINMUX_AIN1, SBC_AINMUX_AIN2, SBC_AINMUX_AIN3, SBC_AINMUX_AIN4,
00148   SBC_AINMUX_AIN5, SBC_AINMUX_AIN6, SBC_AINMUX_AIO1, SBC_AINMUX_AIO2,
00149   /* Now we switch CH8 on and test all channels */
00150   SBC_AINMUX_AIN1, SBC_AINMUX_AIN2, SBC_AINMUX_AIN3, SBC_AINMUX_AIN4,
00151   SBC_AINMUX_AIN5, SBC_AINMUX_AIN6, SBC_AINMUX_AIO1, SBC_AINMUX_AIO2
00152 };
00153 static const uint8_t cau8SBCInitialTestAINADCLoLimits[] =
00154 {
00155   /* First tests correspond to ADC tests */
00156   SBC_TEST_AINADC_VAS_SET_LIMIT_LO, SBC_TEST_AINADC_REF_BG_LIMIT_LO,
00157   SBC_TEST_AINADC_REF_BG2_LIMIT_LO, SBC_TEST_AINADC_REF_23BG2_LIMIT_LO,
00158   SBC_TEST_AINADC_AGND_LIMIT_LO, 
00159   /* Next follows a test for the Mux with a reference voltage */
00160   SBC_TEST_AINMUX_NOSWITCHCLOSED_LIMIT_LO,
00161   /* Next we test each Mux channel with all channels connected to GND */
00162   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00163   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00164   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00165   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00166   /* Now we switch CH1 on and test all channels */
00167   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00168   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00169   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00170   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00171   /* Now we switch CH2 on and test all channels */
00172   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_LO, 
00173   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00174   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00175   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00176   /* Now we switch CH3 on and test all channels */
00177   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,  
00178   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00179   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00180   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00181   /* Now we switch CH4 on and test all channels */
00182   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00183   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_LO, 
00184   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00185   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00186   /* Now we switch CH5 on and test all channels */
00187   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00188   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00189   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00190   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00191   /* Now we switch CH6 on and test all channels */
00192   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00193   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00194   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_LO, 
00195   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00196   /* Now we switch CH7 on and test all channels */
00197   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00198   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00199   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,  
00200   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00201   /* Now we switch CH8 on and test all channels */
00202   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, 
00203   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00204   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00205   SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO, SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_LO,
00206 };
00207 static const uint8_t cau8SBCInitialTestAINADCHiLimits[] =
00208 {
00209   /* First tests correspond to ADC tests */
00210   SBC_TEST_AINADC_VAS_SET_LIMIT_HI, SBC_TEST_AINADC_REF_BG_LIMIT_HI,
00211   SBC_TEST_AINADC_REF_BG2_LIMIT_HI, SBC_TEST_AINADC_REF_23BG2_LIMIT_HI,
00212   SBC_TEST_AINADC_AGND_LIMIT_HI, 
00213   /* Next follows a test for the Mux with a reference voltage */
00214   SBC_TEST_AINMUX_NOSWITCHCLOSED_LIMIT_HI,
00215   /* Next we test each Mux channel with all channels connected to GND */
00216   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00217   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00218   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00219   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00220   /* Now we switch CH1 on and test all channels */
00221   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00222   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00223   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00224   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00225   /* Now we switch CH1 on and test all channels */
00226   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_HI, 
00227   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00228   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00229   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00230   /* Now we switch CH1 on and test all channels */
00231   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,  
00232   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00233   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00234   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00235   /* Now we switch CH1 on and test all channels */
00236   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00237   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_HI, 
00238   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00239   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00240   /* Now we switch CH1 on and test all channels */
00241   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00242   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,  
00243   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00244   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00245   /* Now we switch CH1 on and test all channels */
00246   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00247   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,  
00248   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_HI, 
00249   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00250   /* Now we switch CH1 on and test all channels */
00251   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00252   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,  
00253   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,  
00254   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00255   /* Now we switch CH1 on and test all channels */
00256   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00257   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, 
00258   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00259   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI, SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_HI 
00260 };
00261 static const uint8_t cau8SBCInitialTestAINMUXLoLimits[] =
00262 {
00263   SBC_TEST_AINMUX_NOSWITCHCLOSED_LIMIT_LO, SBC_TEST_AINMUX_SWITCHGND_LIMIT_LO,
00264   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_LO, };
00265 static const uint8_t cau8SBCInitialTestAINMUXHiLimits[] =
00266 {
00267   SBC_TEST_AINMUX_SWITCHGND_LIMIT_HI,
00268   SBC_TEST_AINMUX_SWITCHAVST33_LIMIT_HI, };
00269 /*
00270  ******************************************************************************
00271  * Globals
00272  ******************************************************************************
00273  */
00275 static uint32_t gu32CG147DiagIgnoredResp;
00277 static uint32_t gu32CG147SchedTime;
00278 /*
00279  ******************************************************************************
00280  * Fns
00281  ******************************************************************************
00282  */
00283 /*
00284  ******************************************************************************
00285  * u32fnSBCPerformInitialTestsPOM
00286  * Functional with Scheduled SPI Tx in 17-bit configuration ONLY
00287  ******************************************************************************
00288  */
00289 uint32_t u32fnSBCPerformInitialTestsPOM(const uint8_t u8ERx, 
00290                                         const uint8_t u8TestIndex)
00291 {
00292   /* NOTE: */
00293   /* This routine uses ADC values that are transferred through the       */
00294   /* DMA into the stack. It is critical that the function is still being */
00295   /* executed when the DMA is operational. Otherwise, an IVOR3 interrupt */
00296   /* is possible, best case, or data corruption, worst case. For this    */
00297   /* reason, both the size of the input array (CG147_N_ADC_DATA), and    */
00298   /* the delays here within are not only relevant for the precision of   */
00299   /* the acquired data, but also for the safe execution of this routine. */
00300   /* If in doubt, don't change them.                                     */
00301 
00302   /* General Status */
00303   uint32_t u32Status;
00304   /* Used for Raw responses coming from CG147 */
00305   uint32_t u32RawResponse[2u];
00306   /* CG147 Response placeholder after being treated */
00307   uint8_t u8FilteredResult;
00308   /* Scheduler time holder */
00309   uint32_t u32TimeMarker;
00310   /* Used as time out when waiting for data */
00311   uint32_t u32TimeOut;
00312   /* ADC results holder */
00313   uint16_t au16Aout[CG147_N_ADC_DATA + 1u];
00314   /* Max - min holder */
00315   uint16_t u16AoutDelta;
00316 
00317   /* Init locals */
00318   u32Status = CLEAR;
00319   u32RawResponse[CLEAR] = CLEAR;
00320   u32RawResponse[1u] = CLEAR;
00321   u8FilteredResult = CLEAR;
00322   u32TimeMarker = CLEAR;
00323   u32TimeOut = CLEAR;
00324   u16AoutDelta = CLEAR;
00325 
00326   /* **** POM Built-in Tests (VER CAP, VER ESR, Polarity Protection **********/
00327   /* Route the correct voltage value to AOUT */
00328   u32Status = u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00329                                             SBC_AOUT_CTRL,
00330                                             (cau8SBCInitialTestAoutRoutes[u8ERx] 
00331                                                                           | BIT7),
00332                                             (uint16_t*)&u32RawResponse,
00333                                             (uint32_t*)&u32TimeMarker);
00334   /* Wait for the level to take */
00335   DELAY_MSEC(1u);
00336 
00337   /* Store the current Voltage level in Aout. This is our reference point. */
00338   vfnTransferADCResults(CLEAR, (uint16_t*)&au16Aout, 1u);
00339 
00340   /* Schedule the test */
00341   (void)u8fnCG147ScheduleSafeTest(CG147_SPI_CONFIG_EXT,
00342                                   cau8SBCTests[u8TestIndex],
00343                                   (uint32_t*)&u32RawResponse,
00344                                   (uint16_t*)&(au16Aout) + ((uint16_t)1u),
00345                                   (uint32_t*)&u32TimeMarker);
00346 
00347   /* Wait for scheduler to get the result. Also, wait for DMA to finish */
00348   /* transferring ADC results into the memory.                          */
00349   while ((u32TimeOut <= SBC_TIMEOUT) && 
00350          (CLEAR == u32fnSchedIsTxDone(u32TimeMarker)))
00351   {
00352     /* Wait for one click to pass */
00353     u32TimeOut++;
00354   }
00355   
00356   /* Continue if we didn't time-out */
00357   if(SBC_TIMEOUT != u32TimeOut)
00358   {
00359     /* Analyze the result */
00360     (void)u8fnCG147ExtractResponse((const uint32_t*)&u32RawResponse[CLEAR],
00361                                    (uint8_t*)&u8FilteredResult);
00362     
00363     /* Test the result */
00364     if(u8FilteredResult == cau8SBCTestResults[u8TestIndex])
00365     {
00366       /* Now let's test the ADC reading limits */
00367       u16AoutDelta = u16fnMaxU16DeltaInArray((const uint16_t*)au16Aout,
00368                                              N_ELEMENTS(au16Aout));
00369       if(TRUE == cau8AoutCheckLimit[u8TestIndex])
00370       {
00371         if(cau16AoutHiLimitsPerTest[u8TestIndex] > u16AoutDelta)
00372         {
00373           /* This means we are ok... */
00374           if(cau16AoutLoLimitsPerTest[u8TestIndex] < u16AoutDelta)
00375           {
00376             /* Completely ok. We will exit now */
00377           }
00378           else
00379           {
00380             u32Status = ((BIT0 << u8ERx) | SBC_TEST_LO_LIMIT_FAILED);
00381           }
00382         }
00383         else
00384         {
00385           u32Status = ((BIT0 << u8ERx) | SBC_TEST_HI_LIMIT_FAILED);
00386         }
00387       }
00388       else
00389       {
00390         /* We won't test this limit. */
00391       }
00392     }
00393     else
00394     {
00395       u32Status = ((BIT0 << u8ERx) | SBC_TEST_UNEXPECTED_SPI_RESULT);
00396     }
00397   }
00398   else
00399   {
00400     u32Status = ((BIT0 << u8ERx) | SBC_TEST_SCHEDULER_FAILED);
00401   }
00402 
00403   /* Wait a few msec for the test condition to re-establish into normal */
00404   /* operation. We need this because of cap charging/discharging        */
00405   DELAY_MSEC(100u);
00406 
00407   return (u32Status);
00408 }
00409 /*
00410  ******************************************************************************
00411  * u32fnSBCPerformInitialTestsFLM
00412  * Functional with Scheduled SPI Tx in 17-bit configuration ONLY
00413  ******************************************************************************
00414  */
00415 uint32_t u32fnSBCPerformInitialTestsFLM(const uint16_t cu16SquibMask)
00416 {
00417   /* General Status */
00418   uint32_t u32Status;
00419   /* Loop counter */
00420   uint8_t u8Counter;
00421   uint16_t u16ADCReading;
00422 
00423   /* Init locals */
00424   u32Status = CLEAR;
00425   u8Counter = CLEAR;
00426   u16ADCReading = CLEAR;
00427 
00428   /* Note that DIS_ALP is expected to be low at this point, which means that */
00429   /* the application has been running for at least one second.               */
00430 
00431   /* ******* FLM, Squib diagnosis (Leakage and resistance measurement) *******/
00432   for(u8Counter = CLEAR; u8Counter < N_ELEMENTS(cau8SBCInitialTestAoutRoutesIGH); 
00433       u8Counter++)
00434   {
00435     /* In case of presence of squib */
00436     if((BIT0 << u8Counter) & cu16SquibMask)
00437     {
00438       DELAY_MSEC(2u);
00439       /* Route the correct voltage value IGHx to AOUT and Perform high leakage diagnosis */
00440       u32Status |= u32fnSBCFLMLeakageMeasP1(cau8SBCInitialTestAoutRoutesIGH[u8Counter], 
00441                                             CLEAR);
00442       DELAY_MSEC(2u);
00443       u32Status |= u32fnSBCFLMLeakageMeasP2(CLEAR, u8Counter, 
00444                                             (uint16_t*)&u16ADCReading);
00445       DELAY_MSEC(2u);
00446       /* Route the correct voltage value IGLx to AOUT and Perform high leakage diagnosis */
00447       u32Status |= u32fnSBCFLMLeakageMeasP1(cau8SBCInitialTestAoutRoutesIGL[u8Counter],
00448                                             CLEAR);
00449       DELAY_MSEC(2u);
00450       u32Status |= u32fnSBCFLMLeakageMeasP2(CLEAR, u8Counter,
00451                                             (uint16_t*)&u16ADCReading);
00452       DELAY_MSEC(2u);
00453       /* Route the correct voltage value IGHx to AOUT and Perform low leakage diagnosis */
00454       u32Status |= u32fnSBCFLMLeakageMeasP1(cau8SBCInitialTestAoutRoutesIGH[u8Counter], TRUE);
00455       DELAY_MSEC(2u);
00456       u32Status |= u32fnSBCFLMLeakageMeasP2(TRUE, u8Counter,
00457                                             (uint16_t*)&u16ADCReading);
00458       DELAY_MSEC(2u);
00459       /* Route the correct voltage value IGLx to AOUT and Perform low leakage diagnosis */
00460       u32Status |= u32fnSBCFLMLeakageMeasP1(cau8SBCInitialTestAoutRoutesIGL[u8Counter], TRUE);
00461       DELAY_MSEC(1u);
00462       u32Status |= u32fnSBCFLMLeakageMeasP2(TRUE, u8Counter,
00463                                             (uint16_t*)&u16ADCReading);
00464       DELAY_MSEC(2u);
00465       /* Perform resistance measurement */
00466       u32Status |= u32fnSBCFLMResistanceMeasurement(cau8SBCInitialTestAoutRoutesIGH[u8Counter],
00467                                                     cau8SBCInitialTestAoutRoutesIGL[u8Counter],
00468                                                     u8Counter);
00469     }
00470     else
00471     {
00472       /* Nothing */
00473     }
00474   }
00475   return (u32Status);
00476 }
00477 /*
00478  ******************************************************************************
00479  * u32fnSBCFLMLeakageMeasurement
00480  * Functional with Scheduled SPI Tx in 17-bit configuration ONLY
00481  ******************************************************************************
00482  */
00483 uint32_t u32fnSBCFLMLeakageMeasP1(uint8_t u8IgnitionPin, uint8_t u8LowLeakage)
00484 {
00485   /* General Status */
00486   uint32_t u32Status;
00487   /* Local variable for argument */
00488   uint8_t u8Argu;
00489 
00490   /* Init variables */
00491   u32Status = CLEAR;
00492   u8Argu = CLEAR;
00493 
00494   if(CLEAR != u8LowLeakage)
00495   {
00496     /* Activation of low leakage measurement */
00497     u32Status = u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00498                                               SBC_LOWLEAK, ((uint8_t)0x01u),
00499                                               (uint16_t*)&gu32CG147DiagIgnoredResp,
00500                                               (uint32_t*)&gu32CG147SchedTime);
00501     
00502     /* Amplification v5 activated to increase accuracy with low level implied */
00503     u8Argu = (uint8_t)(BIT7 | BIT6 | u8IgnitionPin);
00504   }
00505   else
00506   {
00507     u8Argu = (uint8_t)(BIT7 | u8IgnitionPin);
00508   }
00509 
00510   /* IGH and IGL on AOUT for ADC conversion */
00511   u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00512                                              SBC_AOUT_CTRL,
00513                                              u8Argu,
00514                                              (uint16_t*)&gu32CG147DiagIgnoredResp,
00515                                              (uint32_t*)&gu32CG147SchedTime);
00516 
00517   /* Wait for the level to take, but do it somewhere else */
00518   return(u32Status);
00519 }
00520 /*
00521  ******************************************************************************
00522  * u32fnSBCFLMLeakageMeasP2
00523  * Functional with Scheduled SPI Tx in 17-bit configuration ONLY
00524  ******************************************************************************
00525  */
00526 uint32_t u32fnSBCFLMLeakageMeasP2(uint8_t u8LowLeakage, uint8_t u8Counter,
00527                                   uint16_t* pu16Aout)
00528 { 
00529   /* Local variable for flag error activation */
00530   uint32_t u32FlagError;
00531   /* Local variable for high and low limits */
00532   uint16_t u16HighLimit;
00533   uint16_t u16LowLimit;
00534   uint32_t u32Status;
00535 
00536   /* Init variables */
00537   u32Status = CLEAR;
00538   u16LowLimit = CLEAR;
00539   u16HighLimit = CLEAR;
00540   u32FlagError = CLEAR;
00541 
00542   /* Store the current Voltage level in Aout */
00543   vfnTransferADCResults(CLEAR, pu16Aout, TRUE);
00544 
00545   /* Figure out what the limits should be based on u8LowLeakage */
00546   if(CLEAR != u8LowLeakage)
00547   {
00548     u16HighLimit = SBC_TEST_FLM_LOWLEAK_LIMIT_HI;
00549     u16LowLimit = SBC_TEST_FLM_LOWLEAK_LIMIT_LO;
00550     u32FlagError = SBC_TEST_FLM_LOWLEAK_FAILED;
00551   }
00552   else
00553   {
00554     /* No Low leakage activation */
00555     u16HighLimit = SBC_TEST_FLM_LEAK_LIMIT_HI;
00556     u16LowLimit = SBC_TEST_FLM_LEAK_LIMIT_LO;
00557     u32FlagError = SBC_TEST_FLM_LEAK_FAILED;
00558   }
00559 
00560   /* De-activation of low leakage measurement */
00561   u32Status = u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00562                                             SBC_LOWLEAK, CLEAR,
00563                                             (uint16_t*)&gu32CG147DiagIgnoredResp,
00564                                             (uint32_t*)&gu32CG147SchedTime);
00565 
00566   /* Diagnosis on ADC value */
00567   if(CLEAR == u32Status)
00568   {
00569     if(u16HighLimit > *pu16Aout)
00570     {
00571       /* This means we are ok... */
00572       if(u16LowLimit < *pu16Aout)
00573       {
00574         /* Completely ok, meaning no leakage detection. We will exit now */
00575       }
00576       else
00577       {
00578         u32Status = ((BIT0 << u8Counter) | u32FlagError);
00579       }
00580     }
00581     else
00582     {
00583       u32Status = ((BIT0 << u8Counter) | u32FlagError);
00584     }
00585   }
00586   else
00587   {
00588     u32Status = ((BIT0 << u8Counter) | SBC_TEST_SCHEDULER_FAILED);
00589   }
00590   return (u32Status);
00591 }
00592 /*
00593  ******************************************************************************
00594  * u32fnSBCFLMResistanceMeasurement
00595  * Functional with Scheduled SPI Tx in 17-bit configuration ONLY
00596  ******************************************************************************
00597  */
00598 uint32_t u32fnSBCFLMResistanceMeasurement(const uint8_t u8IgnitionPinHigh,
00599                                           const uint8_t u8IgnitionPinLow,
00600                                           const uint8_t u8Counter)
00601 {
00602   /* NOTE: */
00603   /* This routine uses ADC values that are transferred through the       */
00604   /* DMA into the stack. It is critical that the function is still being */
00605   /* executed when the DMA is operational. Otherwise, an IVOR3 interrupt */
00606   /* is possible, best case, or data corruption, worst case. For this    */
00607   /* reason, both the size of the input array (CG147_N_ADC_DATA), and    */
00608   /* the delays here within are not only relevant for the precision of   */
00609   /* the acquired data, but also for the safe execution of this routine. */
00610   /* If in doubt, don't change them.                                     */
00611 
00612   uint32_t u32Status;
00613   uint16_t u16SQREF;
00614   uint16_t u16IGH;
00615   uint16_t u16IGL;
00616   uint16_t u16Resistance;
00617   /* Used as time out when waiting for data */
00618   uint32_t u32TimeOut;
00619 
00620   /* Init variables */
00621   u32Status = CLEAR;
00622   u32TimeOut = CLEAR;
00623 
00624   /* ***************** Set current level 40mA or 57mA **********************/
00625   u32Status = u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00626                                             SBC_PROG_FLM_CONF, 0x01 ,
00627                                             (uint16_t*)&gu32CG147DiagIgnoredResp,
00628                                             (uint32_t*)&gu32CG147SchedTime);
00629 
00630   /*  First, measuring the exact level of the test current by mean of SQREF **/
00631   u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00632                                             SBC_FLM_TEST_SRC,
00633                                             0x0D,
00634                                             (uint16_t*)&gu32CG147DiagIgnoredResp,
00635                                             (uint32_t*)&gu32CG147SchedTime);
00636 
00637   u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00638                                             SBC_AOUT_CTRL,
00639                                             (BIT7 | BIT6 | SBC_AOUT_SQREF),
00640                                             (uint16_t*)&gu32CG147DiagIgnoredResp,
00641                                             (uint32_t*)&gu32CG147SchedTime);
00642   /* Wait for the level to take */
00643   DELAY_MSEC(1u);
00644 
00645   /* Store the current Voltage level in Aout */
00646   vfnTransferADCResults(CLEAR, (uint16_t*)&u16SQREF, TRUE);
00647 
00648   u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00649                                             SBC_FLM_TEST_SRC,
00650                                             CLEAR,
00651                                             (uint16_t*)&gu32CG147DiagIgnoredResp,
00652                                             (uint32_t*)&gu32CG147SchedTime);
00653   /* Only continue if the pin is low */
00654   if(CLEAR == u8fnReadPin(PIN_DIS_ALP))
00655   { 
00656     /* ******** Second, IGH and IGL on AOUT with ADC conversions *************/
00657     u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00658                                                SBC_FLM_TEST_SINK,
00659                                                (u8Counter + 1u),
00660                                                (uint16_t*)&gu32CG147DiagIgnoredResp,
00661                                                (uint32_t*)&gu32CG147SchedTime);
00662 
00663     u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00664                                               SBC_FLM_TEST_SRC,
00665                                               (u8Counter + 1u),
00666                                               (uint16_t*)&gu32CG147DiagIgnoredResp,
00667                                               (uint32_t*)&gu32CG147SchedTime);
00668 
00669     u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00670                                               SBC_AOUT_CTRL,
00671                                               (BIT7 | BIT6 | u8IgnitionPinHigh),
00672                                               (uint16_t*)&gu32CG147DiagIgnoredResp, 
00673                                               (uint32_t*)&gu32CG147SchedTime);
00674     /* Wait for the level to take */
00675     DELAY_MSEC(1u);
00676 
00677     /* Store the current Voltage level in Aout */
00678     vfnTransferADCResults(CLEAR, (uint16_t*)&u16IGH, 1u);
00679 
00680     u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00681                                               SBC_AOUT_CTRL,
00682                                               (BIT7 | BIT6 | u8IgnitionPinLow),
00683                                               (uint16_t*)&gu32CG147DiagIgnoredResp,
00684                                               (uint32_t*)&gu32CG147SchedTime);
00685     /* Wait for the level to take */
00686     DELAY_MSEC(5u);
00687 
00688     /* Store the current Voltage level in Aout */
00689     vfnTransferADCResults(CLEAR, (uint16_t*)&u16IGL, 1u);
00690 
00691     u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00692                                               SBC_FLM_TEST_SINK,
00693                                               CLEAR,
00694                                               (uint16_t*)&gu32CG147DiagIgnoredResp,
00695                                               (uint32_t*)&gu32CG147SchedTime);
00696 
00697     u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00698                                               SBC_FLM_TEST_SRC,
00699                                               CLEAR,
00700                                               (uint16_t*)&gu32CG147DiagIgnoredResp,
00701                                               (uint32_t*)&gu32CG147SchedTime);
00702 
00703     /*************************************Third, Diagnosis***********************************/
00704 
00705     /* 68u for SQREF resistance = 6.8Ohm */
00706     u16Resistance = (uint16_t)((SBC_SQREF_RESISTANCE * (u16IGH - u16IGL) / u16SQREF));
00707 
00708     /* Wait for scheduler to get the result. Also, wait for DMA to finish */
00709     /* transferring ADC results into the memory.                          */
00710     while ((u32TimeOut <= SBC_TIMEOUT) &&
00711         (CLEAR == u32fnSchedIsTxDone(gu32CG147SchedTime)))
00712     {
00713       /* Wait for one click to pass */
00714       u32TimeOut++;
00715     }
00716     /* Continue if we didn't time-out */
00717     if((SBC_TIMEOUT != u32TimeOut) & (CLEAR == u32Status))
00718     {
00719       if(SBC_SQUIB_RESISTANCE_LIMIT_HI > u16Resistance)
00720       {
00721         /* This means we are ok... */
00722         if(SBC_SQUIB_RESISTANCE_LIMIT_LO < u16Resistance)
00723         {
00724           /* Resistance measured is correct. We will exit now */
00725         }
00726         else
00727         {
00728           u32Status = ((BIT0 << u8Counter) | SBC_TEST_FLM_RESISTANCE_FAILED);
00729         }
00730       }
00731       else
00732       {
00733         u32Status = ((BIT0 << u8Counter) | SBC_TEST_FLM_RESISTANCE_FAILED);
00734       }
00735     }
00736     else
00737     {
00738       u32Status = ((BIT0 << u8Counter) | SBC_TEST_SCHEDULER_FAILED);
00739     }
00740   }
00741   else
00742   {
00743     u32Status = SBC_TEST_DIS_ALP_FAILED;
00744   }
00745   return (u32Status);
00746 }
00747 /*
00748  ******************************************************************************
00749  * u32fnSBCTestMuxAndADC
00750  * Functional with Scheduled SPI Tx in 17-bit configuration ONLY
00751  ******************************************************************************
00752  */
00753 uint32_t u32fnSBCTestMuxAndADC(uint8_t u8TestIndex)
00754 {
00755   /* General Status */
00756   uint32_t u32Status;
00757   /* Used as time out when waiting for data */
00758   uint32_t u32TimeOut;
00759   uint32_t u32RawADCResponse;
00760   uint8_t u8SBCADCResult;
00761 
00762   /* Init locals */
00763   u32Status = CLEAR;
00764   u32TimeOut = CLEAR;
00765   u32RawADCResponse = CLEAR;
00766   u8SBCADCResult = CLEAR;
00767 
00768 
00769   /* ************************* SBC_TEST_ANA_HEAD  ****************************/
00770   u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00771                                              SBC_TEST_ANA_HEAD,
00772                                              cau8SBCInitialTestAnaHeadSettings[u8TestIndex],
00773                                              (uint16_t*)&gu32CG147DiagIgnoredResp,
00774                                              (uint32_t*)&gu32CG147SchedTime);
00775 
00776   /* ****************** SBC_START_ADC  *************************/
00777   u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00778                                              SBC_START_ADC,
00779                                              cau8SBCInitialTestAnaMUXChannel[u8TestIndex],
00780                                              (uint16_t*)&gu32CG147DiagIgnoredResp,
00781                                              (uint32_t*)&gu32CG147SchedTime);
00782 
00783   /* Wait for the ADC to be ready */
00784   DELAY_MSEC(1u);
00785 
00786   /* Read ADC */
00787   u32Status |= u8fnCG147ScheduleSafeTransfer(CG147_SPI_CONFIG_EXT,
00788                                              SBC_READ_ADC,
00789                                              0x01,
00790                                              (uint16_t*)&u32RawADCResponse,
00791                                              (uint32_t*)&gu32CG147SchedTime);
00792 
00793   /* Wait for scheduler to get the result */
00794   while ((u32TimeOut <= SBC_TIMEOUT) && 
00795          (CLEAR == u32fnSchedIsTxDone(gu32CG147SchedTime)))
00796   {
00797     /* Wait for one click to pass */
00798     u32TimeOut++;
00799   }
00800   /* Continue if we didn't time-out */
00801   if((SBC_TIMEOUT != u32TimeOut) & (CLEAR == u32Status))
00802   {
00803     /* Extract ADC result */
00804     u32Status = u8fnCG147ExtractResponse((const uint32_t*)&u32RawADCResponse,
00805                                          (uint8_t*)&u8SBCADCResult);
00806     if(((CG147_END_OF_PROGRAMMING_FLAG >> BITS_IN_BYTE) == u32Status) || 
00807        (CLEAR == u32Status))
00808     {
00809       if(cau8SBCInitialTestAINADCHiLimits[u8TestIndex] >= u8SBCADCResult)
00810       {
00811         /* This means we are ok... */
00812         if(cau8SBCInitialTestAINADCLoLimits[u8TestIndex] <= u8SBCADCResult)
00813         {
00814           /* Completely ok, meaning no leakage detection. We will exit now */
00815         }
00816         else
00817         {
00818           u32Status = (SBC_TEST_SBC_ADC_FAILED);
00819         }
00820       }
00821       else
00822       {
00823         u32Status = (SBC_TEST_SBC_ADC_FAILED);
00824       }
00825     }
00826     else
00827     {
00828       u32Status = (SBC_TEST_SCHEDULER_FAILED);
00829     }
00830   }
00831   else
00832   {
00833     u32Status = (SBC_TEST_SCHEDULER_FAILED);
00834   }
00835   return (u32Status);
00836 }
00837 /*
00838  ******************************************************************************
00839  *
00840  *  End of file.
00841  *
00842  ******************************************************************************
00843  */